#include <cstdio>

#include <logger.h>

int main()
{
    // dii会紧密排列
    {
        struct Element {
            double d;
            int i;
            int i2;
        };
        struct Element ele = { .d = 4, .i = 3, };
        int* p = (int *)&ele;
        VALUE_LOGGER(sizeof(ele));
        VALUE_LOGGER(p[0]);
        VALUE_LOGGER(p[1]);
        VALUE_LOGGER(p[2]);
        VALUE_LOGGER(p[3]);
        VALUE_LOGGER(ele.i2);
        // sizeof(ele): '16'
        // p[0]: '0'
        // p[1]: '1074790400'
        // p[2]: '3'
        // p[3]: '0'
        // ele.i2: '0'
    }

    // idi会有空槽
    {
        struct Element {
            int i;
            double d;
            int i2;
        };
        struct Element ele = { .i = 3, .d = 4, };
        int* p = (int *)&ele;
        VALUE_LOGGER(sizeof(ele)); // sizeof(ele): 24
        VALUE_LOGGER(p[0]);
        VALUE_LOGGER(p[1]);
        VALUE_LOGGER(p[2]);
        VALUE_LOGGER(p[3]);
        VALUE_LOGGER(p[4]);
        VALUE_LOGGER(p[5]);
        VALUE_LOGGER(ele.i2);
        // sizeof(ele): '24'
        // p[0]: '3'
        // p[1]: '0'
        // p[2]: '0'
        // p[3]: '1074790400'
        // p[4]: '0'
        // p[5]: '0'
        // ele.i2: '0'
    }

    // 不在init的时候也可以用大括号重新给结构体变量赋值
    {
        struct Element {
            double d;
            int i;
            int i2;
        };
        struct Element ele = { .d = 4, .i = 3, };
        VALUE_LOGGER(ele.i);
        ele = { .i = 4 };
        VALUE_LOGGER(ele.i);
        // ele.i: '3'
        // ele.i: '4'
    }

    // 在有默认值的情况下，会优先用默认值初始化结构体变量
    {
        struct DefaultValueStruct {
            int i = 1;
            double d = 2;
            char c = '3';
        };
        struct DefaultValueStruct dvstruct = { .i = 100 };
        VALUE_LOGGER(dvstruct.i);
        VALUE_LOGGER(dvstruct.d);
        VALUE_LOGGER(dvstruct.c);
        // dvstruct.i: 100
        // dvstruct.d: 2
        // dvstruct.c: 3
    }

    // 在有默认值的情况下，不用大括号也可以
    {
        struct DefaultValueStruct {
            int i = 1;
            double d = 2;
            char c = '3';
        };
        struct DefaultValueStruct dvstruct;
        VALUE_LOGGER(dvstruct.i);
        VALUE_LOGGER(dvstruct.d);
        VALUE_LOGGER(dvstruct.c);
        // dvstruct.i: 1
        // dvstruct.d: 2
        // dvstruct.c: 3
    }
    return 0;
}
